/*
 * config.hpp
 *
 *  Created on: 05.11.2009
 *      Author: vifa
 *
 *
 *      Очень грязная отладочная версия
 *      Много эксепериментального
 *
 *      Пока много времени занимает вывод на консоль.
 *
 *      Продумать структуру вывода(красивую и наглядную) на консоль для отладки
 *      Возможно даже двух видов, подробную и обычную
 */

#ifndef CONFIG_HPP_
#define CONFIG_HPP_

#include <iostream>
#include <fstream>
#include <locale>
#include <ios>

using std::ifstream;
using std::string;
using std::cout;
using std::getline;
using std::isspace;
using std::isalpha;
using std::isalnum;

#define run_func(x)		cout<<"+ Run function '"<<x<<"''\n\t\t\tPosition: "<<__FILE__<<"["<<__LINE__<<"]\n";

struct status {
private:
public:
	ifstream file;
	bool loaded_file;
	string file_name;

};

class wm_config {
private:
	status env;
	string first;
	string next;
public:
	wm_config() {
		//begining init
		env.loaded_file = false;

	};
	~wm_config() {

	};
	void load_from_file(const string str) {
		run_func("load_from_file");
		env.file.open(str.c_str() , std::ios::in);
		env.loaded_file = false;
		env.file_name = str;
		if ( env.file ) env.loaded_file = true;
	}
	bool reload_file () {
		run_func("reload_file");
		if ( env.loaded_file ) {
		if ( env.file.is_open() ) env.file.close();
		env.file.open(env.file_name.c_str() , std::ios::in);
		if (env.file) {
			env.loaded_file = true;
			cout << "* file reloaded succesful\n";
			return true;
		} else {
			env.loaded_file = false;
			return false;
		}
		} else {
			cout << "First, load file from func 'load_from_file'!\n";
			return false;
		}
	}
	bool parser () {
		run_func("parser");
		/* Need to reload file? */
		if ( !env.file && env.loaded_file) {
			 if ( !reload_file() ) return false;
		}
		/* begin*/
		if ( (env.loaded_file) && ( env.file.is_open() ) ) {
			cout << "* Begin parsing\n";
			string line;				// Счтываемая строка
			unsigned int line_num = 0;	// Номер считываемой строки
			unsigned int line_pos;		// Обрабатываемый символ в строке
			getline( env.file , line );
			while ( !env.file.eof() ) {
				line_num++;
				cout << "!\t[I] Parsing line: " << line_num << "\n";
				line_pos = 0;			// Сбрасываем текщий симовл на первый
				if ( get_first(line) ) {
					cout<<"\t+++\t "<<first<<"\n";
				} else {
					cout<<"\t+++\t FALSE! \n";
				}

				// Пропускаем все пробелы в начале
				//while( isspace(line[line_pos]) ) line_pos++;
				//if (line_pos >= line.length() ) {
				//	cout << "!\t[I] \\->\tEmpwty line in cfg file: " << line_num <<  "\n";
				//} else {
				//	//Если есть что считывать
				//}
				getline( env.file , line );
			}
		}
		return true;
	}
	/* Функция получает строку
	 * Если удается получить первый элемент в строке
	 * то возвращает true и переменная first содержит этот элемент.
	 * Если не удается, то очищает first и возвращает false
	 * */
	bool get_first(string &line) {
		run_func("get_first");
		unsigned int i = 0;
		first = "";
		while(i <= line.length() ) {
			if( isalpha(line[i]) ) {				//Если буква, то надо считать все слово
				for(;i <= line.length();i++ ){
					if ( isalnum(line[i]) ) {		//Пока имя корректное, считываем.
					first += line[i];
					} else break;
				}
				return true;
			} else if(line[i] == '{') {				//Если начало нового блока
				first = "{";
				return true;
				} else if(line[i] == '}') {			//Если конец текущего блока
						first = "}";
						return true;
					} else if(line[i] == '/') {		//Если начало комментов
						first = "/";
						return true;
					}
			i++;
		}
		return false;
	};
	bool print_file () {
		run_func("print_file");
		if ( !env.file && env.loaded_file) {
			 if ( !reload_file() ) return false;
		}
		if ( (env.loaded_file) && (env.file) ) {
			string line;
			unsigned int line_num = 0;
			getline(env.file, line);
			while( !env.file.eof() ) {
				line_num++;
				cout << line_num <<":\t"<<line << "\n";
				getline(env.file, line);
			}
		} else {
			cout << "No file loaded!\n";
		}
		return true;
	}
};

#endif /* CONFIG_HPP_ */
